#ifndef TAB_H
#define TAB_H

#include <QWidget>
#include <QVBoxLayout>
#include <QMenuBar>
#include <QMenu>
#include <QAction>
#include <QGroupBox>
#include <QPushButton>
#include <QString>
#include <QCloseEvent>
#include <QLabel>
#include <QLineEdit>
#include <QComboBox>
#include <QSpinBox>
#include <QRegExpValidator>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QIcon>
#include <QToolButton>
#include <QButtonGroup>
#include <QCheckBox>
#include <QMap>
#include <QMessageBox>
#include "logo.h"
#include "tabwidget.h"
#include "legami.h"

class Tab : public QWidget
{
    Q_OBJECT
public:

    explicit Tab(Tabwidget*, Legami*, QSqlDatabase* =0);
    virtual ~Tab();
    void init_tab();
    void horizontal_bar_logo();
    virtual void horizontal_bar_choice() = 0;
    virtual void hideAll();
    void clear_le() const;
    void acc();         //la ? con la spiegazione delle diverse tipologie d'account!
    void dim_row(int,int);  //riordino layout
    void pbicon(QPushButton*, int); //associo al PushButton l'icona corrispondente in base al sesso!
    bool check_free(QString) const;
    bool check_url(QString, int) const;
    bool check_interest();
    virtual void showprofile(User*);
    virtual void showG(Gruppo*);
    bool sortPA(int&);  //riordino qmap profac
    void sortG(int&);   //riordino qmap g
    int tryAcc(User*);
    void missingacc();
    virtual int tryGru(Gruppo*);
    virtual void AmmUs()=0; //dopo eliminazione di un account, se TabAmm torno in mainmenu, se TabUser logout.

protected:  //qua il protected ci sta,perche' i membri sotto devono essere accessibili dalle classi derivate!
    //Elementi grafici
    QVBoxLayout* mainLayout;
    QGridLayout* layout;
    QGroupBox* hgl;
    QGroupBox* hgc;
    QPushButton* new_user;
    QPushButton* newammAction;
    QPushButton* accedi;
    QPushButton* registro;
    QPushButton* groups;
    QPushButton* contacts;
    QPushButton* canc;
    QPushButton* delacc;
    QPushButton* upgrade;
    QPushButton* searchacc;
    QPushButton* searchgru;
    QToolButton* back;
    QToolButton* infoacc;
    QToolButton* search;
    QLabel* label1;
    QLabel* label2;
    QLabel* label3;
    QLabel* label4;
    QLabel* label5;
    QLabel* label6;
    QLabel* src1;
    QLabel* src2;
    QLabel* src3;
    QLabel* alert;
    QLabel* step;
    QLabel* info;
    QLineEdit* le1;
    QLineEdit* le2;
    QLineEdit* le3;
    QLineEdit* le4;
    QLineEdit* le5;
    QLineEdit* le6;
    QLineEdit* le7;
    QLineEdit* le8;
    QLineEdit* le9;
    QLineEdit* le10;
    QComboBox *cb;
    QComboBox *cbacc;
    QComboBox *gg;
    QComboBox *mm;
    QComboBox *aa;
    QSpinBox *in;
    QButtonGroup* bgtag;
    QCheckBox* cbno;
    QCheckBox* cbam;
    QCheckBox* cbco;
    QCheckBox* cbpa;
    QCheckBox* cbpn;
    QCheckBox* cbcds;
    QCheckBox* cbmdg;
    Logo* logo;
    Logo* icona;
    Logo* bd;
    Logo* sc;
    Logo* sc2;
    Logo* i;
    Logo* faceb;
    Logo* twitt;
    Tabwidget* tabbed;
    QMap<QPushButton*, Account*> profac;
    QMap<QPushButton*, Gruppo*> g;
    //temporanei
    QVector<QLabel*> temp_labels;
    QVector<QString> temp_in;
    //temporanei,per l'uso nell'upgrade di un utente
    Username* usnm;
    Profilo* prfl;
    Contatto* cont;
    //connessione con la logica
    QSqlDatabase* db;
    Legami* gestore;
    Account* current;
    User* usercurr;
    Gruppo* grcurr;

public slots:
    void removeatab(int);
    virtual void tabba()=0;
    virtual void closetab()=0;
    virtual void login()=0;
    void userinsert(QString);
    void pwdinsert(QString);
    void disab(QString);
    void quitGr();
    void enterGr();
    void eraseGr();
    void deleteacc();
    virtual void showgroups()=0;
    void showuser();
    void showgroup();
    virtual void cercaUser_g(); //richiesta dei dati
    void cercaGruppo_g();
    void cercaUser();   //parte logica. Ricerca effettiva!
    void cercaGruppo();
    virtual void query()=0;
    virtual void queryg()=0;
    virtual void cercaProfiloU(Account*)=0;
    virtual void cercaProfiloG(Gruppo*)=0;
    virtual void logout();
    virtual void confirm(); //nelle operazioni pericolose, conferma della volonta' di effettuare l'operazione.
};

#endif // TAB_H
